#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//#include "sqlink.h"

//单独编译是对的

typedef struct Node
{
    char exp[3] ;
    int coefficience;
    int order;
    struct Node* next;
}Node,*sqlink;

//函数名：initList
//函数功能：初始化链表
//具体实现：创建指针域为NULL的头节点
//参数：无
//返回值：head，返回头节点的起始地址
Node* initList()
{
    Node* head = (Node*)malloc(sizeof(Node));
    if(!head)
    {
        exit(1);
    }
    head->next = NULL;
    return head;
}

//函数名：Get_Length
//函数功能：记录链表的长度
//具体实现：
//参数：
//返回值：i,链表的长度
int Get_Length(Node* head)
{
    int i = 0;
    Node* cur = head->next;
    if(!cur)
    {
        return 0;
    }
    else
    {
        for(;cur != NULL;cur = cur->next)
        {
            i++;
        }
        return i;
    }

}

//函数名：insertNode
//函数功能：在链表的末尾插入一个新节点
//具体实现：找到需要插入的链表的地址，将所需数据存入新生成的节点，再把链表延长、
//参数：Node* head：所需要操作的链表的首地址
//     int data：存入的数据
//返回值：无
void insertNode(Node* head,int coefficience,char exp1,char exp2,char exp3)
{
    Node* newNode = (Node*)malloc(sizeof(Node));
    if(!newNode) exit(1);
    newNode->coefficience = coefficience;
    newNode->exp[0] = exp1;
    newNode->exp[1] = exp2;
    newNode->exp[2] = exp3;
    newNode->order = Get_Length(head)+1;
    newNode->next = NULL;
    Node* temp = head;
    while(temp->next != NULL)
    {
        temp = temp->next;
    }
    temp->next = newNode;
}

//函数名：traversal
//函数功能：遍历输出整个链表
//具体实现：输出一个节点的data，再去找到下一节点输出
//参数：Node* head：需要操作的链表的地址
//返回值：int i，链表的长度
int traversal(Node* head)
{
    int i = 0;
    Node* cur = head->next;
    for(;cur != NULL;cur = cur->next)
    {
        if(!i)
        {
            for(int j = 0;j <=2;j++)
            {
                printf("%d",cur->coefficience);
                printf("%c",cur->exp[i]);
            }
        }
        else
        {
            printf("+");
            printf("%d",cur->coefficience);
            for(int j = 0;j <=2;j++)
            {
                printf("%d",cur->coefficience);
                printf("%c",cur->exp[i]);
            }
        }
        i++;
    }
    return i;
}

/*
//函数名：print
//函数功能：顺序输出链表所有数据
//具体实现：
//参数：Node* head：所需操作链表的首地址  int data：所需要删除的数据
//返回值：无
void print(Node* head)
{
    Node* cur = head->next;
    for(;cur != NULL;cur = cur->next)
    {
        //printf("%d",cur->data);
        printf("%c",cur->text);
        printf("\n");
    }
}
*/

//函数名：deleteNode
//函数功能:删除存有某个特定数据的节点
//具体实现:将符合要求的节点设为第i个，将i+1节点的地址存到第i-1的next，之后删除第i个节点
//参数：Node* head：所需操作链表的首地址  int data：所需要删除的数据
//返回值：无
void deleteNode(Node* head,int order)//Null Hazard
{
    Node* cur = head->next;
    int Counter = 1;
    if(order == 1)
    {
        Node* temp = cur->next;
        head ->next = cur->next;
        free(cur);
        cur = head->next;
        if(cur->next != NULL)
        {
            for(;cur->next!=NULL;cur = cur->next)
            {
                cur->order--;
            }
            cur->order--;
        }
        else
        {
            cur->order--;
        }
    }
    else
    {
        cur = head;
        for(;Counter < order;Counter++)
        {
            cur = cur->next;
        }
        Node* temp = cur->next;
        cur->next = temp->next;
        free(temp);
        if(cur->next != NULL)
        {
            for(cur = cur->next;cur->next!=NULL;cur = cur->next)
            {
                cur->order--;
            }
            cur->order--;
        }
    }
}